#pragma once
#ifdef WIN32
#define DRIVER_EXPORT extern "C" __declspec( dllexport )
#else
#define DRIVER_EXPORT
#endif
#include <parameters.h>

namespace indem {
    /*!
     * 相机返回的数据格式
     */
    struct cameraData {
        //时间戳
        double _timeStamp;  //单位:毫秒
        //图像数据
        unsigned char* _image;
        //数据宽高，通道数
        int _width,_height,_channel,_size;
    };
    //相机数据回调函数
    typedef void(*DriverCameraDataCallback)(cameraData* data);

    /*!
    * 返回的IMU数据格式
    */
    struct IMUData {
        //时间戳
        double _timeStamp;
        //[x,y,z]方向的加速度值,单位 g
        float _acc[3];
        //[]姿态 d/s
        float _gyr[3];
    };
    /* IMU数据回调函数 */
    typedef void(*DriverIMUDataCallback)(IMUData* data);

    //图像分辨率
    enum IMAGE_RESOLUTION {
        RESOLUTION_640,
        RESOLUTION_1280,
        RESOLUTION_DEFAULT = RESOLUTION_640
    };
    //接入SDK的模组驱动接口
    class IDriverInterface {
    public:
        IDriverInterface() {}
        virtual ~IDriverInterface() {}
        //获取模组配置信息,version-结构体的版本号,params-用于接收配置的数组,len-实际拿到数据的长度
        virtual bool GetModuleParams(int& version, unsigned char* params, size_t& len) = 0;
        //设置摄像头回调函数
        virtual void SetCameraCallback(DriverCameraDataCallback callback) = 0;
        //设置IMU回调函数
        virtual void SetIMUCallback(DriverIMUDataCallback callback) = 0;
        //以指定的频率（单位Hz）打开设备
        virtual bool Open(int imuFreq=1000,int imgFreq=50, IMAGE_RESOLUTION resolution= RESOLUTION_DEFAULT) = 0;
        //关闭设备
        virtual void Close() = 0;
    };
};

#ifdef __cplusplus
extern "C" {
#endif
    /*
    * \brief 在SDK初始化、获取驱动信息的时候该接口都会调用,因此该接口的实现应该尽可能的简单
    */
    DRIVER_EXPORT indem::IDriverInterface* DriverFactory();

    /* 头显插入拔出回调函数 */
    typedef void(*DriverHotplugCallback)(bool bArrive);
    DRIVER_EXPORT void SetHotplugCallback(DriverHotplugCallback callback);

#ifdef __cplusplus
}
#endif
